import { createParamDecorator, ExecutionContext, Logger } from '@nestjs/common';

export const CurrentUser = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const logger = new Logger('CurrentUser');
    const request = ctx.switchToHttp().getRequest();

    logger.debug('=== CurrentUser 装饰器开始 ===');

    // 安全地记录用户信息，避免TypeORM实体序列化问题
    if (request.user) {
      logger.debug(`用户ID: ${request.user.id}`);
      logger.debug(`用户名: ${request.user.username}`);
      logger.debug(`用户存在: 是`);
      logger.debug(`用户: 是${JSON.stringify(request.user)}`);

      // 确保返回的是纯JavaScript对象，避免TypeORM实体序列化问题
      // 使用动态方式创建用户对象，自动适应User实体的变化
      const user: any = {};

      // 复制用户的基本属性
      Object.keys(request.user).forEach((key) => {
        // 跳过复杂对象和方法，只复制基本属性
        if (
          typeof request.user[key] !== 'object' &&
          typeof request.user[key] !== 'function'
        ) {
          user[key] = request.user[key];
        }
      });

      // 特殊处理role对象
      if (request.user.role) {
        user.role = {
          id: request.user.role.id,
          code: request.user.role.code,
          name: request.user.role.name,
          description: request.user.role.description,
          createdAt: request.user.role.createdAt,
          updatedAt: request.user.role.updatedAt,
        };
      } else {
        user.role = null;
      }

      logger.debug('=== CurrentUser 装饰器结束 (返回用户对象) ===');
      return user;
    } else {
      logger.debug(`用户存在: 否`);
      logger.debug('=== CurrentUser 装饰器结束 (用户不存在) ===');
      return null;
    }
  },
);